自定义菜单栏


不同的平台对窗口菜单的含义不同,以下讨论将向您展示差异并提供最佳实践,以确保窗口菜单在所有平台上都能正常工作。

创建和设置菜单栏

要创建菜单栏,您只需要在创建菜单时在选项中指定 type: 'menubar'

var your_menu = new nw.Menu({ type: 'menubar' });

并确保附加到菜单栏的每个项目都有一个子菜单。在大多数平台上,菜单栏上的普通纯文本菜单项毫无意义。

var submenu = new nw.Menu();
submenu.append(new nw.MenuItem({ label: 'Item A' }));
submenu.append(new nw.MenuItem({ label: 'Item B' }));

// the menu item appended should have a submenu
your_menu.append(new nw.MenuItem({
  label: 'First Menu',
  submenu: submenu
}));

然后,您可以通过设置窗口的 menu 属性来设置窗口菜单

nw.Window.get().menu = your_menu;

有关 API 的详细信息,请参阅 菜单窗口

平台差异

Windows & Linux

在 Windows 和 Linux 上,菜单栏的行为完全相同。每个窗口可以有一个菜单栏,它们都位于标题栏下方。

全屏/Kiosk 模式下的菜单栏

在全屏或 Kiosk 模式下,菜单栏在 Windows 和 Linux 上的窗口顶部可见。将 win.menu 设置为 null 可以完全删除菜单栏。另请参阅 win.menu

Mac OS X

行为已更改

该功能的行为自 0.13.0 版本起已更改。请参阅 从 0.12 迁移到 0.13 的迁移说明

在 Mac 上,无论应用程序有多少窗口,一个应用程序只能有一个菜单,称为应用程序菜单。许多快捷键依赖于应用程序菜单的存在,例如退出关闭复制

默认情况下,NW.js 应用程序将以默认菜单启动,包括your-app-name编辑窗口。您可以使用 menu.createMacBuiltin 方法获取默认菜单并根据需要进行自定义。

var mb = new nw.Menu({type:"menubar"});
mb.createMacBuiltin("your-app-name");
// append, insert or delete items of `mb` to customize your own menu
// then ...
nw.Window.get().menu = mb;

修复应用程序菜单标题

应用程序菜单的第一个项目显示的是nwjs,而不是your-app-name。要修复它,您需要将 nwjs.app/Contents/Resources/*.lproj/InfoPlist.strings 中所有文件中的 CFBundleName 值设置为 your-app-name,而不是 nwjs

最佳实践

如上所述,在 Windows 和 Linux 上,每个窗口都可以有一个菜单栏,而在 Mac 上,一个应用程序只能有一个应用程序菜单。因此,通常您应该只为您的主窗口设置菜单,并在您可能有多个主窗口时避免使用窗口菜单。

您可能想要为不同的平台设计不同的菜单,然后可以使用 process.platform 获取您所在的平台。